﻿using System;
using System.Data;
using MySql.Data.MySqlClient;

namespace LongWay
{
    public partial class Usuario
    {
        #region Constructores
        /// <summary>
        /// Creo el constructor por defecto.
        /// </summary>
        public Usuario()
        { }
        
        /// <summary>
        /// Constructor por ID.
        /// </summary>
        /// <param name="pId">ID del objeto.</param>
        public Usuario(Int32 pId)
        {
            this.Id = pId;

            //Llena el DataTable con los datos que devuelve la consulta.
            DataTable dt = this.Query();

            //Si no devolvió mas de una fila entonces la consulta me quiere devolver dos (o mas) filas con el mismo ID.
            //Lo cual está mal.
            if (dt.Rows.Count == 1)
                this.FillObject(dt.Rows[0]);
            else
            {
                this.Id = 0;
            }
        }
        #endregion Constructores

        #region Atributos

        //Atributos generales del objeto.
        public Int32 Id { get; set; }
        public String Nombre { get; set; }
        public String Password { get; set; }
        public String Email { get; set; }
        #endregion Atributos

        #region Metodos

        /// <summary>
        /// Guarda el objeto.
        /// </summary>
        public void Save()
        {
            //Abre la conexion con la base de datos.
            MySqlConnection conn = new MySqlConnection(Conexion.ConnectionString());
            conn.Open();

            //Crea el objeto que inserta o actualiza datos en la base.
            MySqlCommand cmd = conn.CreateCommand();

            //Pregunta si el ID es igual a cero, porque en ese caso, quiere decir que no se guardó nunca, y entonces lo tiene que INSERTAR.
            if (this.Id == 0)
            {
                cmd.CommandText = "insert into usuario (Nombre, Password, Email) values (@Nombre, @Password, @Email)";
                cmd.CommandType = CommandType.Text;
            }
            else
            {
                cmd.CommandText = "update usuario set Nombre = @Nombre, Password = @Password, Email = @Email where UsuarioId = @Id";
                cmd.CommandType = CommandType.Text;
            }
            
            
            //Crea los parámetros.
            if (this.Id != 0)
                cmd.Parameters.Add("@Id", MySqlDbType.Int32);

            cmd.Parameters.Add("@Nombre", MySqlDbType.VarChar, 50);
            cmd.Parameters.Add("@Password", MySqlDbType.VarChar, 50);
            cmd.Parameters.Add("@Email", MySqlDbType.VarChar, 100);

            //Asigna valores a los parámetros.
            if (this.Id != 0)
                cmd.Parameters["@Id"].Value = this.Id;

            if (!String.IsNullOrEmpty(this.Nombre))
                cmd.Parameters["@Nombre"].Value = this.Nombre;
            else
                cmd.Parameters["@Nombre"].Value = DBNull.Value;

            if (!String.IsNullOrEmpty(this.Password))
                cmd.Parameters["@Password"].Value = this.Password;
            else
                cmd.Parameters["@Password"].Value = DBNull.Value;

            if (!String.IsNullOrEmpty(this.Email))
                cmd.Parameters["@Email"].Value = this.Email;
            else
                cmd.Parameters["@Email"].Value = DBNull.Value;

            //Ejecuta el INSERT/UPDATE.
            cmd.ExecuteNonQuery();
            
            //Cierro la conexión.
            conn.Close();
        }

        /// <summary>
        /// Elimina el objeto.
        /// </summary>
        public void Delete()
        {
            //Abre la conexion con la base de datos.
            MySqlConnection conn = new MySqlConnection(Conexion.ConnectionString());
            conn.Open();

            //Crea el objeto que inserta o actualiza datos en la base.
            MySqlCommand cmd = conn.CreateCommand();

            //Pregunta si el ID es igual a cero, porque en ese caso, quiere decir que no se guardó nunca, y entonces lo tiene que INSERTAR.
            if (this.Id != 0)
            {
                cmd.CommandText = "delete from usuario where UsuarioId = @Id";
                cmd.CommandType = CommandType.Text;
            }
            
            //Crea los parámetros.
            if (this.Id != 0)
            {
                cmd.Parameters.Add("@Id", MySqlDbType.Int32);
                cmd.Parameters["@Id"].Value = this.Id;

                //Ejecuta el INSERT/UPDATE.
                cmd.ExecuteNonQuery();
            }

            //Cierro la conexión.
            conn.Close();
        }

        /// <summary>
        /// Hace la consulta a la base a través de las propiedades del objeto.
        /// Esto se hace asi: Se crea un objeto, se carga en las propiedades del mismo lo que se quiera buscar, y este método
        /// busca en la base mediante los atributos cargados de dicho objeto.
        /// </summary>
        public DataTable Query()
        {
            MySqlConnection conn = new MySqlConnection(Conexion.ConnectionString());
            conn.Open();
            String sql = "select * from usuario U ";
            sql += " where 1=1 ";

            if (this.Id != 0)
                sql += " and U.UsuarioId = '" + this.Id + "'";

            if(!String.IsNullOrEmpty(this.Email))
                sql += " and U.Email = '" + this.Email + "'";
            
            if (!String.IsNullOrEmpty(this.Nombre))
                sql += " and U.Nombre = '" + this.Nombre + "'";

            if (!String.IsNullOrEmpty(this.Password))
                sql += " and U.Password = '" + this.Password + "'";

            MySqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = sql;
            cmd.CommandType = CommandType.Text;

            //Creo un objeto que me busca los datos en la base.
            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            DataTable dt = new DataTable();

            //Lleno el DataTable con los datos que vienen desde la base.
            da.Fill(dt);

            //Cierro la conexion.
            conn.Close();

            //Devuelvo el DataTable.
            return dt;
        }

        /// <summary>
        /// Llena las propiedades del objeto.
        /// </summary>
        /// <param name="dr"></param>
        private void FillObject(DataRow dr)
        {
            if (dr["UsuarioId"] != null)
                this.Id = Convert.ToInt32(dr["UsuarioId"]);

            if (dr["Email"] != null)
                this.Email = dr["Email"].ToString();

            if (dr["Nombre"] != null)
                this.Nombre = dr["Nombre"].ToString();

            if (dr["Password"] != null)
                this.Password = dr["Password"].ToString();
        }

        public static Usuario Login(String pUserName, String pPassword)
        {
            Usuario oUsuario = new Usuario();
            oUsuario.Nombre = pUserName;
            oUsuario.Password = pPassword;
            DataTable dt = oUsuario.Query();

            if (dt.Rows.Count == 1)
            {
                oUsuario = new Usuario(Convert.ToInt32(dt.Rows[0]["UsuarioID"]));
                if (oUsuario.Id != 0)
                    return oUsuario;
                else
                    return null;
            }
            else
                return null;
        }
        #endregion Metodos
    }
}